package edu.sdbi.judge.controller;

import edu.sdbi.judge.domain.vo.JsonResult;
import edu.sdbi.judge.util.ErrorUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

@RestController
@RequestMapping("/statistics")
public class StaticData15Controller {
    private static final Map<String, Map<Integer, Integer>> HOUR_VISIT_DATA = new HashMap<>();

    static {

        // 初始化测试数据 - 2025-06-14
        Map<Integer, Integer> visits14 = new HashMap<>();
        visits14.put(0, 164);
        visits14.put(1, 172);
        visits14.put(2, 50);
        visits14.put(3, 46);
        for (int i = 0; i < 24; i++) {
            visits14.put(i, 10 + i); // 简单模拟每小时递增的访问量
        }
        HOUR_VISIT_DATA.put("2025-06-14", visits14);

        // 初始化测试数据 - 2025-06-15
        Map<Integer, Integer> visits15 = new HashMap<>();
        for (int i = 0; i < 24; i++) {
            visits15.put(i, 50 + i); // 简单模拟每小时递增的访问量
        }
        HOUR_VISIT_DATA.put("2025-06-15", visits15);

//        // 初始化更多测试数据
//        Map<Integer, Integer> visits16 = new HashMap<>();
//        for (int i = 0; i < 24; i++) {
//            visits16.put(i, 100 + i);
//        }
//        HOUR_VISIT_DATA.put("2025-06-16", visits16);
    }

    /**
     * 活跃时段分析接口 - 返回所有新闻在规定时间范围内每小时的访问量数据
     *
     * @param startDate 开始日期（格式：yyyy-MM-dd）
     * @param endDate   结束日期（格式：yyyy-MM-dd）
     * @return 每小时访问量统计结果
     */
    @PostMapping("/hourVisits") // 修改为POST请求
    public Object getHourlyVisits(@RequestParam("startDate") String startDate,
                                  @RequestParam("endDate") String endDate) {
        try {
            // 验证日期格式
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            dateFormat.setLenient(false); // 严格日期格式检查

            // 解析开始日期和结束日期
            Date start = dateFormat.parse(startDate);
            Date end = dateFormat.parse(endDate);

            // 验证日期范围有效性
            if (start.after(end)) {
                return buildErrorResult(400, "开始日期不能晚于结束日期");
            }

            // 初始化24小时的访问量数组
            int[] hourlyVisits = new int[24];

            // 遍历日期范围内的每一天
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(start);

            while (!calendar.getTime().after(end)) {
                String dateStr = dateFormat.format(calendar.getTime());

                // 获取当天的每小时访问量数据
                Map<Integer, Integer> dailyHourlyData = HOUR_VISIT_DATA.getOrDefault(dateStr, new HashMap<>());

                // 累加每小时的访问量
                for (int hour = 0; hour < 24; hour++) {
                    hourlyVisits[hour] += dailyHourlyData.getOrDefault(hour, 0);
                }

                // 日期加1天
                calendar.add(Calendar.DAY_OF_MONTH, 1);
            }

            // 构建返回结果
            List<Map<String, Object>> resultData = new ArrayList<>();
            for (int hour = 0; hour < 24; hour++) {
                Map<String, Object> hourData = new HashMap<>();
                hourData.put("time", hour);
                hourData.put("visitsCount", hourlyVisits[hour]);
                resultData.add(hourData);
            }

            // 构建成功响应
            JsonResult result = new JsonResult();
            result.setCode(200);
            result.setMsg("新增成功");
            result.setData(resultData);

            return result;
        } catch (ParseException e) {
            return buildErrorResult(400, "日期格式错误，请使用yyyy-MM-dd格式");
        } catch (Exception e) {
            return buildErrorResult(500, ErrorUtil.stackTraceToString(e));
        }
    }

    /**
     * 构建错误响应
     *
     * @param code    错误码
     * @param message 错误信息
     * @return 错误响应JSON字符串
     */
    private Object buildErrorResult(int code, String message) {
        JsonResult result = new JsonResult();
        result.setCode(code);
        result.setMsg(message);
        return result;

    }
}
